<?php

/**
 * Lord_View_Smarty_Smarty
 *
 * Обертка для Smarty
 *
 * @package Basic
 * @author Игорь Будасов aka Lord <igor.budasov@gmail.com>
 */


class Lord_View_Smarty_Smarty extends Zend_View_Abstract
{
	/**
	* Объект Smarty
	* @var Smarty
	*/
	protected $_smarty;

/*------------------------------------------------------------------------------*/

	protected function _run()
	{              DebugBreak();
		$this->strictVars(true);
		$this->_smarty->assign_by_ref('this',$this);
		$templateDirs = $this->getScriptPaths();
		$file = substr(func_get_arg(0),strlen($templateDirs[0]));
		$this->_smarty->template_dir = $templateDirs[0];
		$this->_smarty->compile_id = $templateDirs[0];
		echo $this->_smarty->fetch($file);
	}

/*------------------------------------------------------------------------------*/

	/**
	* Конструктор
	*
	* @param string $tmplPath
	* @param array $extraParams
	* @return void
	*/

	public function __construct($tmplPath = null, $extraParams = array())
	{
		$layout = Zend_Layout::getMvcInstance();
		// Получаем объект  вида
		$view = $layout->getView();

		$this->_smarty = new Lord_View_Smarty_SmartyAdvanced();

		$this->_smarty->setZendView($view);

		if (null !== $tmplPath)
		{
			$this->setScriptPath($tmplPath);
		}

		foreach ($extraParams as $key => $value)
		{
			$this->_smarty->$key = $value;
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	* Возвращение объекта шаблонизатора
	*
	* @return Smarty
	*/

	public function getEngine()
	{
		return $this->_smarty;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Установка пути к шаблонам
	*
	* @param string $path Директория, устанавливаемая как путь к шаблонам
	* @return void
	*/

	public function setScriptPath($path)
	{
		if (is_readable($path))
		{
			$this->_smarty->template_dir = $path;
			return;
		}

		throw new Exception('Invalid template_dir path provided');
	}

/*------------------------------------------------------------------------------*/

	public function display($file)
	{
		@ $this->_smarty->display($file . '.tpl');
	}

/*------------------------------------------------------------------------------*/

	/**
	* Установка пути к папке скомпиленых шаблонов
	*
	* @param string $path Директория, устанавливаемая как путь к шаблонам
	* @return void
	*/

	public function setCompiledPath($path)
	{
		if (is_readable($path))
		{
			$this->_smarty->compile_dir = $path;
			return;
		}

		throw new Exception('Invalid compile_dir path provided');
	}

/*------------------------------------------------------------------------------*/

	/**
	* Извлечение текущего пути к шаблонам
	*
	* @return string
	*/

	public function getScriptPaths()
	{
		return array($this->_smarty->template_dir);
	}

/*------------------------------------------------------------------------------*/

	/**
	* Метод-"псевдоним" для setScriptPath
	*
	* @param string $path
	* @param string $prefix Не используется
	* @return void
	*/

	public function setBasePath($path, $prefix = 'Zend_View')
	{
		return $this->setScriptPath($path);
	}

/*------------------------------------------------------------------------------*/

	/**
	* Метод-"псевдоним" для setScriptPath
	*
	* @param string $path
	* @param string $prefix Не используется
	* @return void
	*/

	public function addBasePath($path, $prefix = 'Zend_View')
	{
		return $this->setScriptPath($path);
	}

/*------------------------------------------------------------------------------*/

	/**
	* Присвоение значения переменной шаблона
	*
	* @param string $key Имя переменной
	* @param mixed $val Значение переменной
	* @return void
	*/

	public function __set($key, $val)
	{
		$this->_smarty->assign($key, $val);
	}

/*------------------------------------------------------------------------------*/

	/**
	* Получение значения переменной
	*
	* @param string $key Имя переменной
	* @return mixed Значение переменной
	*/

	public function __get($key)
	{
		return $this->_smarty->get_template_vars($key);
	}

/*------------------------------------------------------------------------------*/

	/**
	* Позволяет проверять переменные через empty() и isset()
	*
	* @param string $key
	* @return boolean
	*/

	public function __isset($key)
	{
		return (null !== $this->_smarty->get_template_vars($key));
	}

/*------------------------------------------------------------------------------*/

	/**
	* Позволяет удалять свойства объекта через unset()
	*
	* @param string $key
	* @return void
	*/

	public function __unset($key)
	{
		$this->_smarty->clear_assign($key);
	}

/*------------------------------------------------------------------------------*/

	/**
	* Присвоение переменных шаблону
	*
	* Позволяет установить значение к определенному ключу или передать массив
	* пар ключ => значение
	*
	* @see __set()
	* @param string|array $spec Ключ или массив пар ключ => значение
	* @param mixed $value (необязательный) Если присваивается значение одной
	* переменной, то через него передается значение переменной
	* @return void
	*/

	public function assign($spec, $value = null)
	{
		if (is_array($spec))
		{
			$this->_smarty->assign($spec);
			return;
		}

		return $this->_smarty->assign($spec, $value);
	}

/*------------------------------------------------------------------------------*/

	/**
	* Удаление всех переменных
	*
	* @return void
	*/

	public function clearVars()
	{
		$this->_smarty->clear_all_assign();
	}

/*------------------------------------------------------------------------------*/

	/**
	* Обрабатывает шаблон и возвращает вывод
	*
	* @param string $name Шаблон для обработки
	* @return string Вывод
	*/

	public function render($name)
	{
		// зачитываем конфиг
		$config = Zend_Registry::get('config');

		// Задание основных URL
		$this->baseUrl    = $config->url->base;
		$this->imagesUrl  = $config->url->images;
		$this->cssUrl     = $config->url->css;
		$this->jsUrl      = $config->url->js;
		$this->fontsUrl   = $config->url->fonts;
		$this->contentUrl = $config->url->content;
		$this->siteName   = $config->common->siteName;
		// смотрим, есть ли залогиненый юзер
		$this->user = Zend_Auth::getInstance()->getIdentity();

		return $this->_smarty->fetch($name);
	}

/*------------------------------------------------------------------------------*/
}
